package com.sky.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.dto.VisaProductDTO;
import com.sky.dto.VisaProductPageQueryDTO;
import com.sky.dto.VisaProductUpdateDTO;
import com.sky.entity.Country;
import com.sky.entity.Region;
import com.sky.entity.VisaProduct;
import com.sky.mapper.RegionMapper;
import com.sky.mapper.VisaProductMapper;
import com.sky.result.PageResult;
import com.sky.service.VisaProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.sky.mapper.CountryMapper;
import com.sky.dto.CountryDTO;

import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import java.math.BigDecimal;

@Service
@Slf4j
public class VisaProductServiceImpl implements VisaProductService {
    
    @Autowired
    private VisaProductMapper visaProductMapper;
    @Autowired
    private RegionMapper regionMapper;  // 添加 RegionMapper 注入
    @Autowired
    private CountryMapper countryMapper;  // 添加 CountryMapper 注入

    /**
     * 通过国家id查询签证商品
     * @param countryId
     * @return
     */
    @Override
    public List<VisaProduct> getVisaProductsByCountryId(Long countryId) {
        // 直接返回查询结果，因为SQL已经包含了关联查询
        return visaProductMapper.getByCountryId(countryId);
    }

    /**
     * 根据签证产品id查询商品详情
     * @param id 签证产品id
     * @return
     */
    @Override
    public VisaProduct getDetailById(Long id) {
        // 获取基本信息
        VisaProduct visaProduct = visaProductMapper.getById(id);
        if (visaProduct == null) {
            return null;
        }
        
        // 添加日志跟踪 userNotice 字段
        log.info("获取到的签证产品 userNotice: {}", visaProduct.getUserNotice());

        // 获取国家名称
        if (visaProduct.getCountryId() != null) {
            CountryDTO countryDTO = countryMapper.selectById(visaProduct.getCountryId());
            if (countryDTO != null) {
                visaProduct.setCountryName(countryDTO.getCountryName());
            }
        }

        // 获取领区名称
        if (visaProduct.getRegionId() != null) {
            Region region = regionMapper.selectById(visaProduct.getRegionId());
            if (region != null) {
                visaProduct.setRegionName(region.getName());
            }
        }

        return visaProduct;
    }

    /**
     * 添加签证商品
     * @param visaProductDTO
     * @return
     */
    @Override
    public Long addVisaProduct(VisaProductDTO visaProductDTO) {
        // 1. 创建 VisaProduct 对象并设置属性
        VisaProduct visaProduct = new VisaProduct();
        BeanUtils.copyProperties(visaProductDTO, visaProduct);
        
        
        // 确保价格和入境次数正确设置
        if (visaProductDTO.getPrice() != null) {
            visaProduct.setPrice(new BigDecimal(visaProductDTO.getPrice().toString()));
        }
        if (visaProductDTO.getEntryNumber() != null) {
            visaProduct.setEntryNumber(Integer.valueOf(visaProductDTO.getEntryNumber()));
        }
        
        visaProduct.setCreateTime(LocalDateTime.now());
        visaProduct.setUpdateTime(LocalDateTime.now());
        log.info("新增签证产品: {}", visaProduct);
        visaProduct.setCreateTime(LocalDateTime.now());
        visaProduct.setUpdateTime(LocalDateTime.now());

        // 2. 插入 VisaProduct 对象到数据库
        visaProductMapper.insert(visaProduct);

        // 3.获取visaProduct的id
        Long visaProductId = visaProduct.getId();
        log.info("新增签证产品id为: {}", visaProductId);

        // 4. 建立 visa_product_template 关系
        if (visaProductDTO.getTemplateIds() != null && !visaProductDTO.getTemplateIds().isEmpty()) {
            for (Long templateId : visaProductDTO.getTemplateIds()) {
                visaProductMapper.insertVisaProductTemplate(visaProductId, templateId);
            }
        }

        return visaProductId;

    }

    /**
     * 分页查询签证产品
     * @param visaProductPageQueryDTO
     * @return
     */
    @Override
    public PageResult page(VisaProductPageQueryDTO visaProductPageQueryDTO) {
        PageHelper.startPage(visaProductPageQueryDTO.getPage(), visaProductPageQueryDTO.getPageSize());
        Page<VisaProduct> page = visaProductMapper.pageWithDetails(visaProductPageQueryDTO);
        return new PageResult(page.getTotal(), page.getResult());
    }
    @Override
    public VisaProduct getById(Long id) {
        log.info("根据id查询签证产品：{}", id);
        return visaProductMapper.getById(id);
    }

    /**
     * 修改签证产品
     * @param visaProductUpdateDTO
     * @return
     */
    @Override
    @Transactional
    public void updateVisaProduct(VisaProductUpdateDTO visaProductUpdateDTO) {
        log.info("接收到的更新数据：{}", visaProductUpdateDTO);
        
        VisaProduct visaProduct = new VisaProduct();
        BeanUtils.copyProperties(visaProductUpdateDTO, visaProduct);
        
        // 直接设置 visaTypeId，因为现在是 String 类型
        visaProduct.setVisaTypeId(visaProductUpdateDTO.getVisaTypeId());
        
        // 处理价格
        if (visaProductUpdateDTO.getPrice() != null) {
            try {
                visaProduct.setPrice(new BigDecimal(visaProductUpdateDTO.getPrice().toString()));
                log.info("设置价格：{}", visaProduct.getPrice());  // 添加日志
            } catch (Exception e) {
                log.error("价格转换失败: {}", visaProductUpdateDTO.getPrice());
            }
        }

        // 处理入境次数
        if (visaProductUpdateDTO.getEntryNumber() != null) {
            try {
                visaProduct.setEntryNumber(visaProductUpdateDTO.getEntryNumber());
                log.info("设置入境次数：{}", visaProduct.getEntryNumber());  // 添加日志
            } catch (Exception e) {
                log.error("入境次数转换失败: {}", visaProductUpdateDTO.getEntryNumber());
            }
        }
        
        visaProduct.setUserNotice(visaProductUpdateDTO.getUserNotice()); // 更新 userNotice
        visaProduct.setUpdateTime(LocalDateTime.now());
        log.info("最终更新的签证产品信息: {}", visaProduct);  // 添加日志
        visaProductMapper.update(visaProduct);

        // 2. 建立 visa_product_template 关系
        Long visaProductId = visaProductUpdateDTO.getId();
        List<Long> templateIds = visaProductUpdateDTO.getTemplateIds();
        if (templateIds != null && !templateIds.isEmpty()) {
            visaProductMapper.deleteVisaProductTemplateByVisaProductId(visaProductId); // 先删除已有的关系
            templateIds.forEach(templateId -> visaProductMapper.insertVisaProductTemplate(visaProductId, templateId)); // 再新增关系
        }

    }

    /**
     * 启用或禁用签证产品
     * @param id
     * @param isShow
     */
    @Override
    public void startOrStop(Long id, Integer isShow) {
        VisaProduct visaProduct = VisaProduct.builder()
                .id(id)
                .isShow(isShow)
                .build();
        visaProductMapper.updateStatus(visaProduct);


    }

    /**
     * 删除签证产品
     * @param id
     * @return
     */
    @Override
    public void deleteVisaProduct(Long id) {
        //删除签证产品和模板的关联
        visaProductMapper.deleteVisaProductTemplateByVisaProductId(id);
        //删除签证产品
        visaProductMapper.deleteVisaProduct(id);
    }

    /**
     * 获取所有启用的签证产品列表（用于下拉选择）
     * @return
     */
    @Override
    public List<VisaProduct> getAllForSelect() {
        return visaProductMapper.getAllForSelect();
    }

    /**
     * 获取所有启用的签证产品列表（用于下拉选择）
     * @return
     */
    @Override
    public List<VisaProduct> getAllEnabledProducts() {
        return visaProductMapper.getAllEnabledProducts();
    }

}
